package com.example.util;

import com.example.context.UserContext;
import com.example.context.UserContextHolder;

/**
 * 用户上下文工具类
 * 提供便捷的方法获取当前用户信息
 */
public class UserContextUtil {
    
    /**
     * 获取当前用户ID
     * @return 用户ID，如果未登录返回null
     */
    public static Long getCurrentUserId() {
        return UserContextHolder.getCurrentUserId();
    }
    
    /**
     * 获取当前用户名
     * @return 用户名，如果未登录返回null
     */
    public static String getCurrentUsername() {
        return UserContextHolder.getCurrentUsername();
    }
    
    /**
     * 获取当前用户上下文
     * @return 用户上下文，如果未登录返回null
     */
    public static UserContext getCurrentUser() {
        return UserContextHolder.getContext();
    }
    
    /**
     * 检查当前是否有登录用户
     * @return 是否有登录用户
     */
    public static boolean isLoggedIn() {
        return UserContextHolder.hasContext() && getCurrentUserId() != null;
    }
    
    /**
     * 要求当前必须有登录用户，否则抛出异常
     * @return 用户ID
     * @throws RuntimeException 如果未登录
     */
    public static Long requireCurrentUserId() {
        Long userId = getCurrentUserId();
        if (userId == null) {
            throw new RuntimeException("当前用户未登录");
        }
        return userId;
    }
    
    /**
     * 要求当前必须有登录用户，否则抛出异常
     * @return 用户名
     * @throws RuntimeException 如果未登录
     */
    public static String requireCurrentUsername() {
        String username = getCurrentUsername();
        if (username == null) {
            throw new RuntimeException("当前用户未登录");
        }
        return username;
    }
    
    /**
     * 要求当前必须有登录用户，否则抛出异常
     * @return 用户上下文
     * @throws RuntimeException 如果未登录
     */
    public static UserContext requireCurrentUser() {
        UserContext user = getCurrentUser();
        if (user == null || user.getUserId() == null) {
            throw new RuntimeException("当前用户未登录");
        }
        return user;
    }
    
    /**
     * 检查指定用户ID是否为当前登录用户
     * @param userId 用户ID
     * @return 是否为当前用户
     */
    public static boolean isCurrentUser(Long userId) {
        Long currentUserId = getCurrentUserId();
        return currentUserId != null && currentUserId.equals(userId);
    }
}
